package com.edu.exam.entity.grading.analysis;

import com.edu.exam.enums.grading.analysis.ColorPalette;
import com.edu.exam.enums.grading.analysis.DataSourceType;
import com.edu.exam.enums.grading.analysis.RenderEngine;
import com.edu.exam.enums.grading.analysis.ChartStatus;
import com.edu.exam.enums.grading.analysis.ChartTheme;
import com.edu.exam.enums.grading.analysis.VisualizationChartType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 可视化图表实体类
 * 所属模块：E-03 成绩分析模块
 *
 * <p>可视化图表实体用于存储和管理分析结果的可视化图表信息，包含
 * 图表配置、数据、样式、交互功能等。支持多种图表类型和展示方式。</p>
 *
 * <p>核心功能：
 * - 图表管理：创建、配置、存储各种类型的图表
 * - 数据绑定：将分析数据绑定到图表展示
 * - 样式配置：自定义图表的外观和样式
 * - 交互功能：支持图表的交互和动态展示
 * - 导出功能：支持图表导出为多种格式</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class VisualizationChart {

    /**
     * 图表唯一标识
     */
    @Id
    @Column(name = "chart_id", length = 64)
    private String chartId;

    /**
     * 关联结果ID
     *
     * <p>对应的分析结果ID，可为空。</p>
     */
    @Column(name = "result_id", length = 64)
    private String resultId;

    /**
     * 图表名称
     *
     * <p>图表的显示名称。</p>
     */
    @Column(name = "chart_name", length = 255)
    private String chartName;

    /**
     * 图表类型
     *
     * <p>图表的类型，决定展示方式和数据处理方式。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "chart_type", nullable = false, length = 32)
    private VisualizationChartType chartType;

    /**
     * 图表标题
     *
     * <p>图表的主标题。</p>
     */
    @Column(name = "chart_title", length = 255)
    private String chartTitle;

    /**
     * 图表副标题
     *
     * <p>图表的副标题或描述。</p>
     */
    @Column(name = "chart_subtitle", length = 255)
    private String chartSubtitle;

    /**
     * 图表配置
     *
     * <p>JSON格式的图表配置参数。</p>
     */
    @Column(name = "chart_config", columnDefinition = "TEXT")
    private String chartConfig;

    /**
     * 图表数据
     *
     * <p>JSON格式的图表数据。</p>
     */
    @Column(name = "chart_data", columnDefinition = "TEXT")
    private String chartData;

    /**
     * 交互配置
     *
     * <p>JSON格式的交互功能配置。</p>
     */
    @Column(name = "interactive_config", columnDefinition = "TEXT")
    private String interactiveConfig;

    /**
     * 图表图片URL
     *
     * <p>静态图片的存储URL。</p>
     */
    @Column(name = "image_url", length = 500)
    private String imageUrl;

    /**
     * 交互式图表URL
     *
     * <p>交互式图表的访问URL。</p>
     */
    @Column(name = "interactive_url", length = 500)
    private String interactiveUrl;

    /**
     * 图表宽度
     *
     * <p>图表的宽度（像素）。</p>
     */
    @Column(name = "width")
    private Integer width;

    /**
     * 图表高度
     *
     * <p>图表的高度（像素）。</p>
     */
    @Column(name = "height")
    private Integer height;

    /**
     * 图表主题
     *
     * <p>图表的主题风格。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "chart_theme", length = 20)
    private ChartTheme chartTheme = ChartTheme.DEFAULT;

    /**
     * 调色板
     *
     * <p>图表使用的调色板。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "color_palette", length = 20)
    private ColorPalette colorPalette = ColorPalette.DEFAULT;

    /**
     * 图表状态
     *
     * <p>图表的生成状态。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "chart_status", nullable = false, length = 20)
    private ChartStatus chartStatus = ChartStatus.DRAFT;

    /**
     * 数据源类型
     *
     * <p>图表数据的来源类型。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "data_source_type", length = 20)
    private DataSourceType dataSourceType;

    /**
     * 数据源配置
     *
     * <p>JSON格式的数据源配置。</p>
     */
    @Column(name = "data_source_config", columnDefinition = "TEXT")
    private String dataSourceConfig;

    /**
     * 图表描述
     *
     * <p>图表的详细描述信息。</p>
     */
    @Column(name = "chart_description", columnDefinition = "TEXT")
    private String chartDescription;

    /**
     * 图表标签
     *
     * <p>图表的分类标签。</p>
     */
    @Column(name = "chart_tags", length = 500)
    private String chartTags;

    /**
     * 图表语言
     *
     * <p>图表显示的语言。</p>
     */
    @Column(name = "chart_language", length = 10)
    private String chartLanguage = "zh-CN";

    /**
     * 响应式设计
     *
     * <p>是否启用响应式设计。</p>
     */
    @Column(name = "is_responsive")
    private Boolean isResponsive = true;

    /**
     * 动画效果
     *
     * <p>是否启用动画效果。</p>
     */
    @Column(name = "has_animation")
    private Boolean hasAnimation = true;

    /**
     * 数据标签
     *
     * <p>是否显示数据标签。</p>
     */
    @Column(name = "show_data_labels")
    private Boolean showDataLabels = false;

    /**
     * 图例
     *
     * <p>是否显示图例。</p>
     */
    @Column(name = "show_legend")
    private Boolean showLegend = true;

    /**
     * 工具提示
     *
     * <p>是否显示工具提示。</p>
     */
    @Column(name = "show_tooltip")
    private Boolean showTooltip = true;

    /**
     * 网格线
     *
     * <p>是否显示网格线。</p>
     */
    @Column(name = "show_grid")
    private Boolean showGrid = true;

    /**
     * 缩放功能
     *
     * <p>是否启用缩放功能。</p>
     */
    @Column(name = "enable_zoom")
    private Boolean enableZoom = false;

    /**
     * 导出格式
     *
     * <p>支持的导出格式，逗号分隔。</p>
     */
    @Column(name = "export_formats", length = 100)
    private String exportFormats = "PNG,JPG,PDF,SVG";

    /**
     * 图表版本
     *
     * <p>图表配置的版本号。</p>
     */
    @Column(name = "chart_version", length = 20)
    private String chartVersion = "1.0";

    /**
     * 模板ID
     *
     * <p>使用的图表模板ID。</p>
     */
    @Column(name = "template_id", length = 64)
    private String templateId;

    /**
     * 渲染引擎
     *
     * <p>图表的渲染引擎。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "render_engine", length = 20)
    private RenderEngine renderEngine = RenderEngine.DEFAULT;

    /**
     * 缓存键
     *
     * <p>图表缓存的键值。</p>
     */
    @Column(name = "cache_key", length = 255)
    private String cacheKey;

    /**
     * 缓存过期时间
     *
     * <p>图表缓存的过期时间。</p>
     */
    @Column(name = "cache_expiry_time")
    private LocalDateTime cacheExpiryTime;

    /**
     * 访问次数
     *
     * <p>图表被访问的次数。</p>
     */
    @Column(name = "access_count")
    private Integer accessCount = 0;

    /**
     * 最后访问时间
     *
     * <p>图表最后被访问的时间。</p>
     */
    @Column(name = "last_access_time")
    private LocalDateTime lastAccessTime;

    /**
     * 生成耗时
     *
     * <p>图表生成的耗时（毫秒）。</p>
     */
    @Column(name = "generation_duration")
    private Long generationDuration;

    /**
     * 文件大小
     *
     * <p>图表文件的大小（字节）。</p>
     */
    @Column(name = "file_size")
    private Long fileSize;

    /**
     * 错误信息
     *
     * <p>图表生成过程中的错误信息。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    // ===== 审计字段 =====

    /**
     * 创建人
     */
    @Column(name = "created_by", length = 64)
    private String createdBy;

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updateTime;

    
}
